package com.example.springboottest.example.cglib;


import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * cglib动态代理
 * cglib 采用字节码技术实现动态代理功能，其原理是通过字节码技术为目标类生成一个子类，
 * 并在该子类中采用方法拦截的方式拦截所有父类方法的调用，从而实现代理的功能。因为 cglib
 * 使用 成子类的方式实现动态代理，所以无法代理 final 关键宇修饰的方法。 cglib与JDK 动态
 * 代理之间可以相互补充；
 * 1、在目标类实现接口时 ，使用 JDK 动态代理创建代理对象
 * 2、没有实现接口时，使用 cglib 实现动态代理的功能。
 */
public class CglibProxy implements MethodInterceptor {
    private Enhancer enhancer = new Enhancer(); // cglib 中的 nhancer 对象

    public Object getProxy(Class clazz) {
        enhancer.setSuperclass(clazz); // 指定生成的代理类的父类
        enhancer.setCallback(this); // 设置 Callback 对象
        return enhancer.create(); //通过字节码技术动态创建子类实例
    }

    // 实现 MethodInterceptor 接口的 intercept()方法
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        System.out.println("前置处理");

        Object result = proxy.invokeSuper(obj, args); // 调用父类中的方法

        System.out.println("后置处理");
        return result;
    }
}